<?php
/**
 * 範囲指定
 * (Beetweenだと～以上～以下ってのが必須だったから）
 *
 * @author tanaka
 * @package Validate
 * @subpackage RangedInt
 */
class Validate_IntInRange extends Zend_Validate_Abstract
{
	const IN_RANGE = 'inRange';
	const NOT_IN_RANGE = 'nowInRange';

	protected $_messageTemplates = array(
		self::IN_RANGE => "'%value%' is in range",
		self::NOT_IN_RANGE => "'%value%' is not in range.",
	);
	
	/**
	 * コンストラクタ
	 * 
	 * @param array|ZendConfig $options
	 * @throws Zend_Validate_Exception
	 * @return
	 */
	public function __construct($options)
	{
		if ($options instanceof Zend_Config) $options = $options->toArray();

		if (is_array($options)) {
			if (array_key_exists('max', $options)) {
				$this->_rangeMax = $options['max'];
			}

			if (array_key_exists('min', $options)) {
				$this->_rangeMin = $options['min'];
			}
		}
		
		if(is_null($this->_rangeMax) && is_null($this->_rangeMin)){
			throw new Zend_Validate_Exception('オプションが足りない');
		}
	}

	/**
	 * 最大値
	 * @var int
	 */
	protected $_rangeMax = null;

	/**
	 * 最小値
	 * @var int
	 */
	protected $_rangeMin = null;

	/**
	 * (non-PHPdoc)
	 * @see Zend_Validate_Interface::isValid()
	 */
	public function isValid($value)
	{
		if (is_array($value)) {
			$flg = true;
			foreach ($value as $array) {
				$flg = $flg & $this->isValid($array);
			}
			return $flg;
		}

		if (!is_null($this->_rangeMax) && $this->_rangeMax < $value) {
			$this->_error(self::NOT_IN_RANGE);
			return false;
		}

		if (!is_null($this->_rangeMin ) && $this->_rangeMin > $value) {
			$this->_error(self::NOT_IN_RANGE);
			return false;
		}

		return true;
	}
}
